using UnityEngine;

/*
* Introduction：    Singleton 是所有单例类的基类，提供了获取单例实例的静态方法
                    创建成功后会调用 Init 方法进行初始化
* Version：         1.0
* Creator：         yixiang.hui
* Creation Time：   2025.9.1
*
* Last Editor：     yixiang.hui 
* Last Edit Time：  2025.9.1
* Note：            1.0版本完成基本功能
*/

namespace HyxFrame.Core
{
    public abstract class Singleton<T> where T : Singleton<T>, new()
    {
        private static T _instance;
        private static readonly object _lock = new object();
        private static bool _isInitialized = false;

        /// <summary>
        /// 获取单例实例，首次访问时自动创建并初始化
        /// </summary>
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_lock)
                    {
                        if (_instance == null)
                        {
                            _instance = new T();
                            _isInitialized = true;
                        }
                    }
                }
                return _instance;
            }
        }

        public static T CreateInstance()
        {
            return Instance;
        }
        /// <summary>
        /// 构造函数，防止外部实例化
        /// </summary>
        protected Singleton()
        {
            if (_instance != null)
            {
                Debug.LogError($"[{typeof(T)}] 单例已存在，禁止重复实例化！");
            }
            else if (!_isInitialized)
            {
                OnInit();
            }
        }

        /// <summary>
        /// 单例初始化方法，子类可重写
        /// </summary>
        protected virtual void OnInit() { Init(); }

        protected abstract void Init();

    }
}